Win10下的浏览器沙箱逃逸 Browser and Kernel Exploitation - Kernel
作者:b2ahex
上一篇edge中拿到任意地址读写,控制返回地址后,下面该触发内核漏洞进行提权,完成沙箱逃逸。
1. 分析篇
Poc来源: https://github.com/progmboy/cansecwest2017 (感谢progmboy大佬分享)
补丁前:
补丁后:释放内存后,buf指针没有清零,导致后续可以继续使用。
向上分析,执行到这里是因为条件判断成功: StringCbLengthW() < 0
跟进 StringCbLengthW ,发现当前buf,在指定长度之内没有找到\0即可满足条件 StringCbLengthW() < 0 判定成功:
因此当下面的buf被传到内核后,由于 DirectComposition::CBaseExpressionMarshaler::SetBufferProperty 中 StringCbLengthW 没有在指定长度范围内找到 0x00,释放了该buf,但是没有将指针清零,导致后续流程继续使用这个对象的buf指针时可能发生异常访问:
继续查看POC:
对应的内核部分,ReleaseResource() 最终会触发析构函数,如果buf指针非零就再次FreePool,此时造成了doublefree:
第一次释放:
第二次调用 releaseresource 再次释放,引发BSOD:
2. 利用篇
代码中可以控制申请pool的大小,因为后面会freepool,即可以控制hole大小:
通过palette占用这个hole,此时指针指向的是这个palette,因为x64下palette必须要大于0xD0,所以要把buf设置的大一些,第一次申请pool的地方:
释放了之后,pool fenghui用相同大小的palette占住这个free hole:
通过 ReleaseResource 事件再次释放buf指针,此时是释放了刚刚申请的palette:
现在如果申请数据可以覆盖原先 palette.pFirstcolor ,就可以在r3通过 GetPaletteEntries/SetPaletteEntries 读写一次任意地址,利用一组palette或者bitmap,即可获得完整的内核模式任意地址读写:(Win10RS1下可通过 gSharedInfo 泄露 AcceleratorTables 地址,结合pool fengshui获取bitmap/palette地址,详细参考:Abusing-GDI-Reloaded-ekoparty-2016)
palette->pFirstcolor指向bitmapA->PvScan0
SetPaletteEntries(hP, 0, 2, bitmapB->PvScan0);
由于edge运行在沙箱中,low Integrity无法调用NtQuerySystemInformation,所以下面要获取system进程的token,需要通过其他漏洞泄露出内核模块基址:
从nt模块定位到nt!PsInitialSystemProcess,获取 SYSTEM EPROCESS:
保存system token,遍历链表找到当前进程并修改Token完成提权:
(后面有点懒的截图了…)
ps:在edge下创建进程时需要清零下PEB中的 IsPackagedProcess 标志:
KERNELBASE!GetSidSubAuthority+0x12f:
00007ffa`4940380f 488b4820 mov rcx,qword ptr [rax+20h] ds:00000000`00000020=????????????????
0:024> k
# Child-SP RetAddr Call Site
00 000000e5`a3c9e5f0 00007ffa`493f9371 KERNELBASE!GetSidSubAuthority+0x12f
01 000000e5`a3c9e820 00007ffa`493f9161 KERNELBASE!AppXPreCreationExtension+0x321
02 000000e5`a3c9e9d0 00007ffa`49f8fc03 KERNELBASE!AppXPreCreationExtension+0x111
03 000000e5`a3c9ea70 00007ffa`49422403 KERNEL32!BasepAppXExtension+0x23
04 000000e5`a3c9eac0 00007ffa`49415662 KERNELBASE!CreateProcessInternalW+0x1083
05 000000e5`a3c9f590 00007ffa`49412f36 KERNELBASE!CreateProcessInternalA+0x452
06 000000e5`a3c9f700 00007ffa`49fd0966 KERNELBASE!CreateProcessA+0x66
07 000000e5`a3c9f770 00007ffa`4cab19ba KERNEL32!WinExec+0x106
kd> dt _peb 00000079b2357000 IsPackagedProcess
nt!_PEB
+0x003 IsPackagedProcess : 0y0
结合上一篇浏览器的利用,构造ROP,最终实现edge远程代码执行+提权沙箱逃逸:
Reference:
https://github.com/progmboy/cansecwest2017
http://powerofcommunity.net/poc2017/andrew.pdf
https://whereisk0shl.top/Dark%20Composition%20Exploit%20in%20Ring0.html
https://www.coresecurity.com/system/files/publications/2016/10/Abusing-GDI-Reloaded-ekoparty-2016_0.pdf